function isPlainObject(obj) {
  return obj ? typeof obj === 'object' && Object.getPrototypeOf(obj) === Object.prototype : false
}

function handleProperties(sourceProperties, mergeProperties) {
  if (!isPlainObject(mergeProperties)) {
    return mergeProperties
  }
  if (! isPlainObject(sourceProperties)) {
    return mergeProperties
  }
  Object.keys(mergeProperties).forEach(key => {
    mergeProperties[key] = handleSchema(sourceProperties[key], mergeProperties[key])
  })
  return mergeProperties
}

function handleSchema(source, merge) {
  if (!isPlainObject(source)) return merge
  if (!isPlainObject(merge)) return merge
  const result = {}
  Object.assign(result, source, merge)
  if (merge.type === 'object') {
    result.properties = handleProperties(source.properties, merge.properties)
  } else if (merge.type === 'array') {
    result.items = handleSchema(source.items, merge.items)
  }
  return result
}

module.exports = function (sourceJsonSchema, mergeJsonSchema) {
  return handleSchema(sourceJsonSchema, mergeJsonSchema)
}
